package log

import (
	"context"

	"go.uber.org/zap"
)

// 业务相关的定制方法

const (
	KeyRequestID   = "requestID"
	KeyUsername    = "username"
	KeyWatcherName = "watcher"
)

// 在 zap 中， L 方法返回一个高性能强类型 logger 。

// L 返回一个子 logger ，携带来自上下文的业务属性。
func (l *logger) L(ctx context.Context) *logger {
	newLogger := l.clone()

	if requestID := ctx.Value(KeyRequestID); requestID != nil {
		newLogger.logger = newLogger.logger.With(zap.Any(KeyRequestID, requestID))
	}
	if username := ctx.Value(KeyUsername); username != nil {
		newLogger.logger = newLogger.logger.With(zap.Any(KeyUsername, username))
	}
	if watcherName := ctx.Value(KeyWatcherName); watcherName != nil {
		newLogger.logger = newLogger.logger.With(zap.Any(KeyWatcherName, watcherName))
	}

	return newLogger
}

// clone 返回一个子 logger 。
func (l *logger) clone() *logger {
	copy := *l

	return &copy
}
